/* Timer.java */

/**
 *  Implements a simple stopwatch/timer type class
 *          based on Java wall-clock time
 */


/**
 *  RUNNING() == true  <==>  start() called with no corresponding
 *                           call to stop()
 *
 *  All times are given in units of msec.
 */
public class Timer {

  /**
   *  Initializes Timer to 0 msec
   */
  public Timer() {
    reset();
  }

  /**
   *  Starts the timer.  Accumulates time across multiple calls to start.
   */
  public void start() {
    running = true;
    tStart = System.currentTimeMillis();
    tFinish = tStart;
  }

  /**
   *  Stops the timer.  returns the time elapsed
   *          since the last matching call to start(), or
   *          0 if no such matching call was made.
   */
  public long stop() {
    tFinish = System.currentTimeMillis();
    if( running ) {
      running = false;

      long diff = (tFinish - tStart);
      tAccum += diff;
      return diff;
    }
    return 0;
  }

  /**
   *  if RUNNING()   ==>  returns the time since last call to start()
   *  if !RUNNING()  ==>  returns total elapsed time
   */
  public long elapsed() {
    if( running )
      return System.currentTimeMillis() - tStart;

    return tAccum;
  }

  /**
   *  Stops timing, if currently RUNNING(); resets
   *          accumulated time to 0.
   */
  public void reset() {
    running = false;
    tStart = tFinish = 0;
    tAccum = 0;
  }

  private boolean running;
  private long tStart;
  private long tFinish;
  private long tAccum;       // total time
}
